

#if !defined(COCO_PARSER_H__)
#define COCO_PARSER_H__

#include <iostream>
#include <stdlib.h>
#include <wchar.h>
#include <stdio.h>
#include "semanticCube.h"
#include "semanticValidationStructures.h"

using namespace std;


#include "Scanner.h"



class Errors {
public:
	int count;			// number of errors detected

	Errors();
	void SynErr(int line, int col, int n);
	void Error(int line, int col, const wchar_t *s);
	void Warning(int line, int col, const wchar_t *s);
	void Warning(const wchar_t *s);
	void Exception(const wchar_t *s);

}; // Errors

class Parser {
private:
	enum {
		_EOF=0,
		_id=1,
		_main=2,
		_class=3,
		_inherits=4,
		_constructor=5,
		_method=6,
		_static=7,
		_private=8,
		_public=9,
		_global=10,
		_returns=11,
		_var=12,
		_list=13,
		_of=14,
		_int=15,
		_float=16,
		_char=17,
		_boolet=18,
		_equis=19,
		_receives=20,
		_parameters=21,
		_not=22,
		_and=23,
		_or=24,
		_fruit=25,
		_loop=26,
		_until=27,
		_times=28,
		_starting=29,
		_the=30,
		_iteration=31,
		_when=32,
		_do=33,
		_otherwise=34,
		_continue=35,
		_breakdance=36,
		_jump=37,
		_on=38,
		_to=39,
		_case=40,
		_default=41,
		_set=42,
		_element=43,
		_gato=44,
		_from=45,
		_as=46,
		_print=47,
		_remove=48,
		_at=49,
		_push=50,
		_return=51,
		_call=52,
		_with=53,
		_arguments=54,
		_get=55,
		_pop=56,
		_read=57,
		_make=58,
		_via=59,
		_attributes=60,
		_cte_f=61,
		_cte_i=62,
		_cte_char=63,
		_string_comillas=64,
		_mas=65,
		_menos=66,
		_multiplicacion=67,
		_division=68,
		_concatenacion=69,
		_coma=70,
		_punto=71,
		_dos_puntos=72,
		_pipe=73,
		_abre_llaves=74,
		_cierra_llaves=75,
		_abre_parentesis=76,
		_cierra_parentesis=77,
		_delimitador=78,
		_igual=79,
		_mayor=80,
		_menor=81,
		_distinto=82,
		_menor_igual=83,
		_mayor_igual=84,
		_comparacion=85,
		_verdadero=86,
		_falso=87
	};
	int maxT;

	Token *dummyToken;
	int errDist;
	int minErrDist;

	void SynErr(int n);
	void Get();
	void Expect(int n);
	bool StartOf(int s);
	void ExpectWeak(int n, int follow);
	bool WeakSeparator(int n, int syFol, int repFol);

public:
	Scanner *scanner;
	Errors  *errors;

	Token *t;			// last recognized token
	Token *la;			// lookahead token

semanticCube cube;
	intermediateCode code;

	classDirectory classDir;
	const wchar_t* currentClass;
	procedureDirectory *procDir;
	const wchar_t* currentProc;
	variablesTable *varTable;
	const wchar_t* currentVar;

	stack<int> stackO;
	stack<const wchar_t*> sOper;
	stack<const wchar_t*> sType;
	stack<int> sJump;
	stack<int> sJumpIf;
	stack<const wchar_t*> sConstructor;

	constVariableTable constantTable;
	int contProc;

	int contTemp[4];

	queue<const wchar_t*> qAuxClass;
	queue<const wchar_t*> qAuxParams;
	queue<int> qAuxArgs;
	queue<int> qContinue;
	queue<int> qBreak;

	int auxListLength;
	int tempReturn;
	bool auxLoop;
	bool objMet;



	Parser(Scanner *scanner);
	~Parser();
	void SemErr(const wchar_t* msg);

	void coffeec();
	void COFFEEC1();
	void DECLARACION_CLASE();
	void CLASE1();
	void CLASE2();
	void CLASE3();
	void METODO_MAIN();
	void CLASE();
	void DECLARACION_CLASE1();
	void DECLARACION_VARIABLES();
	void VAR_CLASE();
	void CONSTRUCTOR();
	void METODO();
	void BLOQUE();
	void DECLARACION_VARIABLES2();
	void S_TIPO();
	void DECLARACION_VARIABLES1();
	void ASIGNACION();
	void ESTATUTO();
	void CONSTRUCTOR1();
	void RECIBE_PARAMETROS();
	void METODO1();
	void METODO2();
	void METODO3();
	void METODO4();
	void S_TIPO1();
	void TIPO();
	void LIST();
	void LIST1();
	void M_EXPRESION();
	void RECIBE_PARAMETROS1();
	void BUCLE();
	void CONDICION();
	void JUMP();
	void ESTATUTO1();
	void ESTATUTO2();
	void INVOCACION();
	void ESCRITURA();
	void BORRAR_DE_LISTA();
	void PUSH();
	void ESTATUTO_RETURN();
	void SET_LISTA();
	void C_ID();
	void ESTATUTO3();
	void S_EXPRESION();
	void LECTURA();
	void GET_LISTA();
	void POP();
	void STRING();
	void PARAMETRO();
	void PARAMETRO2();
	void BUCLE1();
	void BLOQUE_BUCLE();
	void EXP();
	void BLOQUE_BREAK();
	void CONDICION1();
	void CONDICION2();
	void BLOQUE_BUCLE1();
	void BLOQUE_BUCLE2();
	void JUMP1();
	void JUMP2();
	void BLOQUE_BREAK1();
	void ESCRITURA1();
	void ESCRITURA2();
	void INVOCACION1();
	void INSTANCIACION();
	void INSTANCIACION1();
	void STRING1();
	void STRING2();
	void ESTRUCTURA_LISTA();
	void ESTRUCTURA_LISTA1();
	void ESTRUCTURA_LISTA2();
	void M_EXPRESION1();
	void EXPRESION();
	void M_EXPRESION2();
	void EXPRESION1();
	void EXPRESION2();
	void TERMINO();
	void EXP1();
	void EXP2();
	void FACTOR();
	void TERMINO1();
	void TERMINO2();
	void FACTOR1();
	void VAR_NUM();

	void Parse();

}; // end Parser



#endif // !defined(COCO_PARSER_H__)

